package com.agent.tools;

import com.agent.entity.CourseSchedule;
import com.agent.mapper.CourseScheduleMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

/*
    有关课程表的工具类
 */

@Component
public class CourseScheduleTools {

    // 获取当前用户指定星期、时间段（可选）的课程信息
    @Autowired
    private CourseScheduleMapper courseScheduleMapper;

    private static final DateTimeFormatter TIME_FMT = DateTimeFormatter.ofPattern("HH:mm");

    @Tool(name = "query_courses_by_weekday",
            value = "根据星期查询课程。必填：userId, weekday(1-7)。可选：startTime(HH:mm), endTime(HH:mm)。当提供时间时，将筛选在该时间范围内的课程。")
    public String queryCoursesByWeekday(
            @P(value = "userId") Long userId,
            @P(value = "weekday，1-7 表示周一到周日") Integer weekday,
            @P(value = "开始时间（HH:mm，可选）", required = false) LocalTime startTime,
            @P(value = "结束时间（HH:mm，可选）", required = false) LocalTime endTime
    ) {
        // 参数校验
        if (userId == null) {
            return "参数错误：userId 不能为空";
        }
        if (weekday == null || weekday < 1 || weekday > 7) {
            return "参数错误：weekday 取值范围为 1-7（1=周一，7=周日）";
        }

        System.out.println("查询指定时间课程：" + "星期" +weekday + " 时间" + startTime + " - " + endTime);

        // 构建基本的查询语句
        LambdaQueryWrapper<CourseSchedule> qw = new LambdaQueryWrapper<CourseSchedule>()
                .eq(CourseSchedule::getUserId, userId)
                .eq(CourseSchedule::getDayOfWeek, weekday)
                .orderByAsc(CourseSchedule::getStartTime);

        // 时间筛选逻辑：
        // - 若仅提供 startTime：筛选课程的结束时间 >= startTime（即与起点之后可能重叠/覆盖到）
        // - 若仅提供 endTime：筛选课程的开始时间 <= endTime
        // - 若两者都提供：筛选区间重叠（course.start < endTime && course.end > startTime）
        if (startTime != null && endTime != null) {
            qw.lt(CourseSchedule::getStartTime, endTime)
              .gt(CourseSchedule::getEndTime, startTime);
        } else if (startTime != null) {
            qw.ge(CourseSchedule::getEndTime, startTime);
        } else if (endTime != null) {
            qw.le(CourseSchedule::getStartTime, endTime);
        }

        // 查询数据库
        List<CourseSchedule> list = courseScheduleMapper.selectList(qw);
        if (list == null || list.isEmpty()) {
            return "该时间范围内暂无课程";
        }

        // 构建返回结果
        StringBuilder sb = new StringBuilder();
        sb.append("📚 课程安排（周").append(weekday).append(")");
        if (startTime != null || endTime != null) {
            sb.append(" ");
            if (startTime != null) sb.append(startTime.format(TIME_FMT));
            sb.append("-");
            if (endTime != null) sb.append(endTime.format(TIME_FMT));
        }
        sb.append(":\n\n");

        for (CourseSchedule c : list) {
            sb.append("• ").append(nullToDash(c.getCourseName()));
            java.util.List<String> meta = new java.util.ArrayList<>();
            if (c.getTeacher() != null && !c.getTeacher().isBlank()) meta.add(c.getTeacher());
            if (c.getLocation() != null && !c.getLocation().isBlank()) meta.add(c.getLocation());
            if (!meta.isEmpty()) {
                sb.append("（").append(String.join("，", meta)).append("）");
            }
            sb.append("\n  ⏰ ");
            sb.append(c.getStartTime() != null ? c.getStartTime().format(TIME_FMT) : "--");
            if (c.getEndTime() != null) {
                sb.append(" - ").append(c.getEndTime().format(TIME_FMT));
            }
            if (c.getWorkWeek() != null && !c.getWorkWeek().isBlank()) {
                sb.append("  ｜ 周次：").append(c.getWorkWeek());
            }
            sb.append("\n\n");
        }
        /*
            返回结果示例：
                📚 课程安排（周3） 08:00-12:00:

                • 高等数学（张教授，教学楼A101）
                  ⏰ 08:00 - 09:30  ｜ 周次：1-16

                • 大学英语（李老师，教学楼B205）
                  ⏰ 10:00 - 11:30  ｜ 周次：1-16

         */

        return sb.toString().trim();
    }

    private String nullToDash(String s) {
        return (s == null || s.isBlank()) ? "-" : s;
    }

}
